package juc.blockqueue.arrayblockqueue;

/**
 * @ClassName BasicProducerConsumer
 * @PackageName juc.blockqueue.arrayblockqueue
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/9/4 上午10:26
 * @Version 1.0
 */
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
 * ArrayBlockingQueue 是一个基于数组实现的有界阻塞队列，它具有以下典型使用场景：
 * 主要特点
 * 有界容量：创建时需要指定固定容量，队列大小不可变
 * 阻塞特性：
 * 当队列满时，插入操作会被阻塞
 * 当队列空时，取出操作会被阻塞
 * 线程安全：内部使用可重入锁保证线程安全
 */
public class BasicProducerConsumer {
    public static void main(String[] args) {
        // 创建容量为3的有界阻塞队列
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3);

        // 生产者线程
        Thread producer = new Thread(() -> {
            try {
                for (int i = 1; i <= 6; i++) {
                    queue.put(i); // 队列满时会阻塞
                    System.out.println("Produced: " + i);
                    Thread.sleep(1000); // 模拟生产时间
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 消费者线程
        Thread consumer = new Thread(() -> {
            try {
                for (int i = 0; i < 6; i++) {
                    Integer item = queue.take(); // 队列空时会阻塞
                    System.out.println("Consumed: " + item);
                    Thread.sleep(3000); // 模拟消费时间
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        producer.start();
        consumer.start();
    }
}
